package com.changgou.goods.service.impl;

import com.changgou.goods.dao.CategoryMapper;
import com.changgou.goods.dao.ParaMapper;
import com.changgou.goods.dao.TemplateMapper;
import com.changgou.goods.pojo.Category;
import com.changgou.goods.pojo.Para;
import com.changgou.goods.pojo.Template;
import com.changgou.goods.service.ParaService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * @Author seafwg
 * @Date 2021/11/30 2:18 下午
 * @Version 1.0
 * @description 参数管理模块
 */
@Service
public class ParaServiceImpl implements ParaService {

    @Autowired
    private ParaMapper paraMapper;

    @Autowired
    private TemplateMapper templateMapper;

    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * 根据分类ID查询参数列表
     * @param cId
     * @return
     */
    @Override
    public List<Para> findParaByCategory(Integer cId) {
        // 查询分类对象
        Category category = categoryMapper.selectByPrimaryKey(cId);
        Para para = new Para();
        // 生成参数对象，设置模版ID
        para.setTemplateId(category.getTemplateId());
        // 根据参数对象的主键查询参数列表
        List<Para> paraList = paraMapper.select(para);
        return paraList;
    }

    /**
     * 新增参数：
     * @param para
     * @return
     */
    @Override
    public int add(Para para) {
        // 更新模板数据中参数数量
        updateTemplateForParaNum(para, 1);
        int insert = paraMapper.insert(para);
        return insert;
    }

    /**
     * 根据ID删除参数
     * @param id
     * @return
     */
    @Override
    public int delete(Integer id) {
        // 先根据id查询出para对象
        Para para = paraMapper.selectByPrimaryKey(id);
        // 更新模板管理中的参数数量
        updateTemplateForParaNum(para, -1);
        // 根据id删除
        int delete = paraMapper.deleteByPrimaryKey(id);
        return delete;
    }

    /**
     * 更新数据：
     * @param para
     * @param id
     */
    @Override
    public void update(Para para, Integer id) {
        para.setId(id);
        paraMapper.updateByPrimaryKeySelective(para);
    }

    /**
     * 根据ID查询参数信息
     * @param id
     * @return
     */
    @Override
    public Para findById(Integer id) {
        return paraMapper.selectByPrimaryKey(id);
    }

    /**
     * 查询所有信息：
     * @return
     */
    @Override
    public List<Para> findAll() {
        return paraMapper.selectAll();
    }

    /**
     * 多条件查询参数：
     * @param para
     * @return
     */
    @Override
    public List<Para> findList(Para para) {
        // 生成查询条件
        Example example = buildParaExample(para);
        List<Para> parasList = paraMapper.selectByExample(example);
        return parasList;
    }

    /**
     * 分页查询：
     * @param pageSize
     * @param pageNum
     * @return
     */
    @Override
    public PageInfo<Para> findPage(Integer pageSize, Integer pageNum) {
        // 使用分页组件
        PageHelper.startPage(pageSize, pageNum);
        // 查询所有
        List<Para> paraList = paraMapper.selectAll();
        // 根据查询数据生成分页数据
        PageInfo<Para> paraPageInfo = new PageInfo<>(paraList);
        return paraPageInfo;
    }

    /**
     * 多条件分页查询：
     * @param para
     * @param pageSize
     * @param pageNum
     * @return
     */
    @Override
    public PageInfo<Para> findPage(Para para, Integer pageSize, Integer pageNum) {
        // 分页
        PageHelper.startPage(pageSize, pageNum);
        // 生成查询条件
        Example example = buildParaExample(para);
        // 查询
        List<Para> paraList = paraMapper.selectByExample(example);
        // 根据查询数据生成分页信息
        PageInfo<Para> paraPageInfo = new PageInfo<Para>(paraList);
        return paraPageInfo;
    }

    /**
     * 参数的新增和删除都要修改模版管理中的参数数量
     * @param para
     * @param num
     */
    public void updateTemplateForParaNum(Para para, Integer num) {
        // 从模版中根据para的id查出来模板数据对象
        Template template = templateMapper.selectByPrimaryKey(para.getId());
        // 根据增删修改模板中的参数数量
        template.setParaNum(template.getParaNum() + num);
        // 更新这条数据
        templateMapper.updateByPrimaryKeySelective(template);
    }

    /**
     * 构建查询对象：
     * @param para
     * @return
     */
    public Example buildParaExample(Para para) {
        // 生成查询对象
        Example example = new Example(Para.class);
        // 生成条件对象
        Example.Criteria criteria = example.createCriteria();
        // 构造查询查询条件
        if(para != null) {
            // id
            if (!StringUtils.isEmpty(para.getId())) {
                criteria.andEqualTo("id", para.getId());
            }
            // name - 名称
            if(!StringUtils.isEmpty(para.getName())) {
                criteria.andLike("name", "%" + para.getName() + "%");
            }
            // options - 选项
            if(!StringUtils.isEmpty(para.getOptions())) {
                criteria.andEqualTo("options", para.getOptions());
            }
            // seq - 排序
            if(!StringUtils.isEmpty(para.getSeq())) {
                criteria.andEqualTo("seq", para.getSeq());
            }
            // templateId - 模板id
            if(!StringUtils.isEmpty(para.getTemplateId())) {
                criteria.andEqualTo("templateId", para.getTemplateId());
            }
        }
        return example;
    }
}
